package com.crl.gen.service;

import com.crl.gen.dao.GenConfigDao;
import com.crl.gen.dao.GenDbFieldDao;
import com.crl.gen.dao.GenFieldDao;
import com.crl.gen.dao.GenTableDao;
import com.crl.gen.dto.GenFieldDTO;
import com.crl.gen.model.GenConfig;
import com.crl.gen.model.GenDbField;
import com.crl.gen.model.GenField;
import com.crl.gen.model.GenTable;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @description:
 * @author: 孔垂云
 * @version: 1.0
 * @date: 2020/7/26 21:38
 */
@Service
public class GenDbFieldService {
    @Autowired
    private GenDbFieldDao genDbFieldDao;
    @Autowired
    private GenTableDao genTableDao;
    @Autowired
    private GenFieldDao genFieldDao;
    @Autowired
    private GenConfigDao genConfigDao;

    public List<GenField> loadDbField(int tableId) {
        GenTable genTable = genTableDao.get(tableId);
        if (genTable == null) {
            return null;
        }
        GenConfig genConfig = genConfigDao.get(genTable.getAuthorId());
        int databaseType = genConfig.getDatabaseType();//数据库类型
        List<GenDbField> listDbField = genDbFieldDao.list2(genTable.getTablename().toUpperCase());
        List<GenField> list = new ArrayList<>();
        //把从数据库获取到的数据库字段赋值到配置的列表里面
        // 1字符串，2整数，3小数，4date
        if (databaseType == 1) {
            for (GenDbField genDbField : listDbField) {
                GenField genField = new GenField();
                genField.setFieldname(genDbField.getComments());//字段说明
                genField.setFieldcode(genDbField.getColumnName());
                //字段类型
                //判断数据库类型，oracle还是mysql
                if (genDbField.getDataType().equals("VARCHAR2")) {
                    genField.setLength(genDbField.getDataLength());//长度
                    genField.setType(1);//字符串
                    genField.setInputLength(genDbField.getDataLength());//输入的长度
                } else if (genDbField.getDataType().equals("CHAR")) {
                    genField.setLength(genDbField.getDataLength());//长度
                    genField.setType(1);//字符串
                    genField.setInputLength(genDbField.getDataLength());//输入的长度
                } else if (genDbField.getDataType().equals("NUMBER")) {
                    if (genDbField.getDataScale() != null && genDbField.getDataScale() > 0) {//小数
                        genField.setType(3);
                        genField.setLength(genDbField.getDataPrecision());
                        genField.setPoint(genDbField.getDataScale());
                    } else {//整数
                        genField.setType(2);
                        if (genDbField.getDataPrecision() != null) {//如果精度为null，则取字段的长度
                            genField.setLength(genDbField.getDataPrecision());
                        } else {
                            genField.setLength(genDbField.getDataLength());
                        }
                        genField.setPoint(0);
                    }
                } else if (genDbField.getDataType().equals("DATE")) {
                    genField.setLength(7);//长度，日期默认长度是7
                    genField.setType(4);//日期
                }
                genField.setIsBlank(1);//是否为空
                genField.setIsListField(1);//是否列表字段
                genField.setDisplayOrder(genDbField.getColumnId());//排序
                genField.setTableId(tableId);//tableId
                genField.setListWidth(100);
                genField.setListAlign("left");//默认左对齐
                list.add(genField);
            }
        } else if (databaseType == 2) {//mysql
            for (GenDbField genDbField : listDbField) {
                GenField genField = new GenField();
                genField.setFieldname(genDbField.getComments());//字段说明
                genField.setFieldcode(genDbField.getColumnName());
                //字段类型
                //判断数据库类型，oracle还是mysql
                if (genDbField.getDataType().equals("varchar")) {
                    genField.setLength(genDbField.getDataLength());//长度
                    genField.setType(1);//字符串
                    genField.setInputLength(genDbField.getDataLength());//输入的长度
                } else if (genDbField.getDataType().equals("char")) {
                    genField.setLength(genDbField.getDataLength());//长度
                    genField.setType(1);//字符串
                    genField.setInputLength(genDbField.getDataLength());//输入的长度
                } else if (genDbField.getDataType().equals("int")) {//整数
                    genField.setType(2);
                    if (genDbField.getDataPrecision() != null) {//如果精度为null，则取字段的长度
                        genField.setLength(genDbField.getDataPrecision());
                    } else {
                        genField.setLength(genDbField.getDataLength());
                    }
                    genField.setPoint(0);
                }
                else if (genDbField.getDataType().equals("tinyint")) {//整数
                    genField.setType(2);
                    if (genDbField.getDataPrecision() != null) {//如果精度为null，则取字段的长度
                        genField.setLength(genDbField.getDataPrecision());
                    } else {
                        genField.setLength(genDbField.getDataLength());
                    }
                    genField.setPoint(0);
                }

                else if (genDbField.getDataType().equals("float")) {
                    if (genDbField.getDataScale() != null && genDbField.getDataScale() > 0) {//小数
                        genField.setType(3);
                        genField.setLength(genDbField.getDataPrecision());
                        genField.setPoint(genDbField.getDataScale());
                    }
                } else if (genDbField.getDataType().equals("date")) {
                    genField.setType(4);//日期
                } else if (genDbField.getDataType().equals("datetime")) {
                    genField.setType(5);//时间
                }
                genField.setIsBlank(1);//是否为空
                genField.setIsListField(1);//是否列表字段
                genField.setDisplayOrder(genDbField.getColumnId());//排序
                genField.setTableId(tableId);//tableId
                genField.setListWidth(100);
                genField.setListAlign("left");//默认左对齐
                list.add(genField);
            }
        }
        return list;
    }


    /**
     * 保存数据表
     *
     * @param list
     */
    public void saveDbFileld(List<GenFieldDTO> list) {
        int tableId = list.get(0).getTableId();
        genFieldDao.deleteByTableId(tableId);
        for (GenFieldDTO genFieldDTO : list) {
            GenField genField = new GenField();
            BeanUtils.copyProperties(genFieldDTO, genField);
            genFieldDao.add(genField);
        }
    }
}
